package com.framework.tomcat.ex03.pyrmont.server;

import com.framework.tomcat.ex03.pyrmont.Request;
import com.framework.tomcat.ex03.pyrmont.Response;
import com.framework.tomcat.ex03.pyrmont.processor.ServletProcessor2;
import com.framework.tomcat.ex03.pyrmont.processor.StaticResourceProcessor;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author LIN
 * @date 2022-06-06 21:34
 */
public class HttpServer2 {
    // shutdown command
    private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";

    // the shutdown command received
    private boolean shutdown = false;

    public static void main(String[] args) {
        HttpServer2 server = new HttpServer2();
        server.await();
    }

    public void await() {
        ServerSocket serverSocket = null;
        int port = 8080;
        try{
            serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }
        while(!shutdown) {
            Socket socket = null;
            InputStream input = null;
            OutputStream output = null;
            try {
                socket = serverSocket.accept();
                input = socket.getInputStream();
                output = socket.getOutputStream();
                // create Request object and parse
                Request request = new Request(input);
                request.parse();

                // Create Response object
                Response response = new Response(output);
                response.setRequest(request);

                // 检查这个请求是一个servlet还是一个静态资源
                // "/servlet"
                // a static resource
                if(request.getUri() == null){
                    socket.close();
                    continue;
                }
                if(request.getUri().startsWith("/servlet/")){
                    ServletProcessor2 processor = new ServletProcessor2();
                    processor.process(request, response);

                }else{
                    StaticResourceProcessor processor = new StaticResourceProcessor();
                    processor.process(request, response);
                }


                // Close the socket
                socket.close();

                // check if the previous URI is a shutdown command
                shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
            } catch (Exception e) {
                e.printStackTrace();
                System.exit(1);
            }
        }
    }

}
